package Request;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

/**
 * @author Freddy Feria
 */
public class Autenticador {

    private final Integer SEGUNDOS = 1000;
    private final Integer MINUTOS = SEGUNDOS * 60;
    private HashMap<Long, Date> listaUsuarios;
    private Random aleatorio;
    private Timer temporizador;

    public Autenticador() {
        listaUsuarios = new HashMap<>();
        aleatorio = new Random((new Date()).getTime());
        temporizador = new Timer();
        servicioActualizacion();
    }

    private Long generarAleatorio() {
        return Math.abs(aleatorio.nextLong());
    }

    private Date fechaCaducidad() {
        return (new Date(new Date().getTime() - (15 * MINUTOS)));
    }

    private void actualizarRegistro(ArrayList<Long> listaRegistros) {
        for (Long registro : listaRegistros) {
            listaUsuarios.remove(registro);
        }
    }

    private void servicioActualizacion() {
        temporizador.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                ArrayList<Long> resultados = new ArrayList<>();
                for (Iterator<Map.Entry<Long, Date>> it = listaUsuarios.entrySet().iterator(); it.hasNext();) {
                    Map.Entry<Long, Date> entry = it.next();
                    if (entry.getValue().after(fechaCaducidad())) {
                        resultados.add(entry.getKey());
                    }
                }
                actualizarRegistro(resultados);
            }
        }, 0, 5 * MINUTOS);
    }

    public boolean verificarRegistro(Long key) {
        if (listaUsuarios.containsKey(key)) {
            return true;
        } else {
            return false;
        }
    }

    public Long registrarNuevo() {
        Long key = generarAleatorio();
        while (!listaUsuarios.containsKey(key)) {
            listaUsuarios.put(key, new Date());
        }
        return key;
    }
}
